package com.itheima.interceptor;

import com.itheima.exception.ClientException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author zhouxiangyang
 * @Date 2022/6/14 15:44
 */
@Component //添加到spring容器中
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 前处理，在处理器方法执行之前执行
     * @param request 请求对象
     * @param response 响应对象
     * @param handler 当前方法对象，类似于aop中的连接点对象，封装了要执行的方法Method
     * @return 返回true表示放行，返回false表示拦截，不继续执行。
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("preHandle...");
        //1 从session域中获取user信息，
        Object user = request.getSession().getAttribute("user");
        //2 如果没有获取到了，就表示用户没有登录，return false阻止访问
        if(user==null){
            //抛出客户端异常，告诉客户端没有登录
            throw new ClientException("你还没有登录，无权访问!");
        }
        return true;  //表示是否放行
    }
    /**
     * 后处理，在处理器方法执行之后并且没有异常时才执行
     * @param request 请求对象
     * @param response 响应对象
     * @param handler 当前方法对象，类似于aop中的连接点对象，封装了要执行的方法Method
     * @param modelAndView 当前处理方法进行页面跳转的视图对象，如果处理器方法是响应json，那么该对象就是null。
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle...modelAndView={}",modelAndView);
    }
    /**
     * 完成后处理，在处理器方法执行之后，无论是否出现异常都会执行。
     * @param request 请求对象
     * @param response 响应对象
     * @param handler 当前方法对象，类似于aop中的连接点对象，封装了要执行的方法Method
     * @param ex 异常对象
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion...");
    }
}
